一个下载量达数百万次的 Node.js 模块中被指存在一个安全缺陷,可导致攻击者在服务器上执行拒绝服务攻击或者获得完整的远程 shell 访问权限。
该漏洞的编号是 CVE-2020-7699,存在于npm 组件“express-fileupload”中。它在 npm 的下载量至少是730万次,且这个下载量是保守估算,因为这个数字并未考虑从 GitHub、镜像网站和其它克隆仓库中下载的情况。该漏洞类型被称为“原型污染”,常见于 JavaScript (JS) 代码中。由于 JS 是基于原型的语言,因此该语言中的每个对象、函数和数据结构都继承了可通过“_proto_”赋值函数进行修改的“Prototype”属性。修改现有代码的能力是一种预期功能,有助于轻松扩展具有更多属性和方法的现有对象的功能。这类原型攻击在现有对象中注入不兼容的对象类型引发错误,至少可导致拒绝服务后果,甚至可能导致远程 shell 访问后果。
由于express-fileupload 具有“parseNested”特征,因此真实攻击是很可能发生的。当“parseNested”选项启用时,它负责将上传的 JSON 数据“扁平化 (flatten)”为嵌入式对象。发现该缺陷的安全研究员 Posix 在博客文章中解释称,“express-fileupload模块为在 Node.js 应用程序中上传并管理文件提供了多种选择。其中,parseNested 的作用是扁平化参数。”因此,如果我们将{“a.b.c”}作为输入,则在内部它将被用作{“a”:{“b”:{“C”:true}}}。
例如,如果你的应用程序使用“express-fileupload”模块上传文件,则“parseNested”选项被设置为“true”,从而下令使服务器端应用程序开始将收到的数据扁平化为嵌入式 JSON 对象。
如“Content-Disposition” HTTP 标头中提供了简单的 payload,则攻击者可通过提供“__proto__.toString”值来触发攻击。
如之前所述,“__Proto__”赋值函数能够影响 JavaScript 的“Prototype”属性,该属性是所有 JS 对象和结构继承的属性。这里展示的 HTTP 请求将覆盖并损坏代码中每个对象的内置“toString”方法。研究人员表示,“如果Object.prototype.toString”被污染,那么它将导致出现错误,而且对于每个请求而言,express 总会返回500个错误。”
研究员还描述了更为复杂的exploit 变体,它可导致攻击者获得易受攻击系统上的 shell。然而,该 exploit 基本上依赖于该应用程序是否使用了易受攻击的“express-fileupload”版本以及是否使用了模板引擎 EJS(嵌入式 JavaScript 模板)。假设你的应用程序正在使用 EJS 解析上传的数据,而没有执行额外的检查,那么攻击者就能够发送HTTP 请求,覆写 EJS 的“outputFunctionName”选项。
以上所示的 payload 利用的是express-fileupload 中的原型污染,并下令 EJS(如使用)发布 Node.js 的一个“child__process”。这一新发布的进程将进一步使攻击者获得反向 shell。一旦建立了这种连接,攻击者就能够在受陷服务器中执行任意代码。
不过,研究人员在文章中表示,该缺陷可能并非影响所有用户。只有那些启用了“parseNested”选项的应用程序才易受该原型污染缺陷的影响。此外,实现完全的 shell 访问权限和远程代码执行,必须和其它库如 EJS 结合使用,这是前提条件。不过,值得注意的是,EJS 并非唯一一个可能获得 shell 访问权限的库。Posix 表示,这些攻击不仅影响 EJS,“我在博客文章中解释了如何通过 EJS 获得 shell,DNA由于原型污染漏洞能够改变多种上下文的流,因此仅仅是添加一些应用模块就可能为攻击者增加很多可能性。”收到报告的几小时内,“express-fileupload”库就修复了这个漏洞,用户应尽快从 npm 中安装最新的已修复版本 1.1.9。
https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的
产品线。
觉得不错,就点个 “在看” 吧~